package com.gushen.library.filter;

import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.loader.AssetsProvider;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import com.gushen.library.R;
import com.gushen.library.ShaderContents;


/**
 * 不需要显示到屏幕上
 * 写入fbo (帧缓存)
 */
public class CameraFilter extends AbstractFrameFilter {


    private float[] matrix;


    public CameraFilter(Context context) {
        super(context, ShaderContents.camera_vertex, ShaderContents.camera_frag);
    }

    @Override
    protected void initCoordinate() {
        mGLTextureBuffer.clear();
        //摄像头是颠倒的
//        float[] TEXTURE = {
//                0.0f, 0.0f,
////                1.0f, 0.0f,
////                0.0f, 1.0f,
////                1.0f, 1.0f
//        };
        //调整好了镜像
//        float[] TEXTURE = {
//                1.0f, 0.0f,
//                0.0f, 0.0f,
//                1.0f, 1.0f,
//                0.0f, 1.0f,
//        };
        //修复旋转 逆时针旋转90度
        float[] TEXTURE = {
                0.0f, 0.0f,
                0.0f, 1.0f,
                1.0f, 0.0f,
                1.0f, 1.0f,
        };
        mGLTextureBuffer.put(TEXTURE);
    }


    @Override
    public int onDrawFrame(int textureId) {
        //设置了视口的大小，这里将视口设置为整个输出窗口的大小，mOutputWidth和mOutputHeight分别代表输出窗口的宽度和高度。
        GLES20.glViewport(0, 0, mOutputWidth, mOutputHeight);
        //将帧缓冲区绑定到当前的OpenGL上下文，这样所有的绘制操作都会被渲染到这个帧缓冲区中。
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBuffers[0]);

        //激活了一个着色器程序，这个程序定义了如何处理顶点和片段着色。
        GLES20.glUseProgram(mGLProgramId);


        //将顶点位置和纹理坐标的缓冲区位置重置为0
        //GLES20.glVertexAttribPointer函数用于告诉OpenGL如何从缓冲区中读取顶点数据，vPosition和vCoord是着色器中定义的顶点属性的位置索引
        mGLVertexBuffer.position(0);
        GLES20.glVertexAttribPointer(vPosition, 2, GLES20.GL_FLOAT, false, 0, mGLVertexBuffer);
        GLES20.glEnableVertexAttribArray(vPosition);

        mGLTextureBuffer.position(0);
        GLES20.glVertexAttribPointer(vCoord, 2, GLES20.GL_FLOAT, false, 0, mGLTextureBuffer);
        GLES20.glEnableVertexAttribArray(vCoord);


        //这行代码将一个4x4的矩阵传递给着色器中的vMatrix变量，这个矩阵通常用于变换顶点的位置。
        GLES20.glUniformMatrix4fv(vMatrix, 1, false, matrix, 0);

        //激活了一个纹理单元，GLES20.GL_TEXTURE0是第一个纹理单元。
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);


        //将一个外部纹理绑定到当前激活的纹理单元上，textureId是这个纹理的唯一标识符。
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
        //将纹理单元的索引传递给着色器中的vTexture变量，这里传递的是0，对应之前激活的GL_TEXTURE0。
        GLES20.glUniform1i(vTexture, 0);

        //这行代码开始绘制图形，GL_TRIANGLE_STRIP表示使用三角形带模式，从索引0开始的4个顶点将被用来绘制两个三角形。
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

        //分别解绑了纹理和帧缓冲区，这样后续的绘制操作就不会影响到当前的纹理和帧缓冲区了
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

        return mFrameBufferTextures[0];
    }


    public void setMatrix(float[] matrix) {
        this.matrix = matrix;
    }
}
